import axios from 'axios'
// import Qs from 'qs' // 某些情况下用来序列化请求参数，例 data: Qs.stringify(data)
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'

export const getTokenHeader = () => {
    let token = getToken()
    if (token) {
        return { ...JSON.parse(token) }
    } else {
        return {}
    }
}

// create an axios instance
const service = axios.create({
    // baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
    baseURL: '/api',
    // withCredentials: true, // send cookies when cross-domain requests
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    timeout: 30000, // request timeout
    // params: {}, //query类型请求携带参数
    // data: {}, //body类型请求携带参数
    // transformRequest: [function (data, headers) { //对发送的 data 进行任意转换处理
    //     console.warn(data);
    //     console.warn(headers);
    //     return data;
    // }],
})

// 请求拦截器
service.interceptors.request.use(config => {
    config.headers = {
        ...config.headers,
        'module': 'admin',
        ...getTokenHeader()
    }
    // console.warn(config);
    // console.warn(config.data);
    return config
}, error => {
    console.error(error)
    return Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use(response => {
    const res = response.data
    switch (res.code) {
        case 200:
            return res
        case 500:
            Message({ message: res.message || 'Error', type: 'error', duration: 5 * 1000 })
            return res
        case 401:
            MessageBox.confirm('请重新登录', '提示', {
                confirmButtonText: '重新登录',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(() => {
                store.dispatch('user/resetToken').then(() => {
                    location.reload()
                })
            })
            return res
        case 403:
            MessageBox.alert(res.message, '提示', { confirmButtonText: '确定', type: 'warning' })
            return res
    }
}, error => {
    console.error(error) // for debug
    Message({ message: error.message, type: 'error', duration: 5 * 1000 })
    return Promise.reject(error)
})

export default service
